package com.sensetime.jv.util;

import cn.hutool.jwt.JWT;
import cn.hutool.jwt.JWTUtil;
import cn.hutool.jwt.signers.JWTSigner;
import cn.hutool.jwt.signers.JWTSignerUtil;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

/**
 * Hutool-JWT 工具类
 */
public class JwtUtil {

    /** 密钥（长度 ≥ 32 字节更安全） */
    private static final String KEY = "f8624d9efdb74345a0e217e2ce088194";
    private static final JWTSigner SIGNER = JWTSignerUtil.hs256(KEY.getBytes());

    private static final String SIGN = "jv";
    /** 默认有效期：（可自定义） */
    private static final long TTL_MILLIS = 999999999999999999L;

    /**
     * 生成 token
     *
     * @param payload 要存储的业务数据（任意对象）
     * @return token
     */
    public static String createToken(String payload) {
        return createToken(payload, TTL_MILLIS);
    }

    public static String createToken(String payload, long ttlMillis) {
        Map<String, Object> map = new HashMap<>();
        map.put("payload", payload);

        return JWT.create()
                .addPayloads(map)          // 或 setPayloads(map)
                .setJWTId(UUID.randomUUID().toString())
                .setIssuer(SIGN)
                .setIssuedAt(new Date())
                .setExpiresAt(new Date(System.currentTimeMillis() + ttlMillis))
                .setSigner(SIGNER)
                .sign();
    }

    /**
     * 解析 token
     *
     * @param token JWT 字符串
     * @return 解析后的 JWT 对象
     */
    public static JWT parse(String token) {
        return JWTUtil.parseToken(token).setSigner(SIGNER);
    }


    /**
     * 解析 token
     *
     * @param token JWT 字符串
     * @return 解析后的 JWT 对象
     */
    public static String parseString(String token) {
        return String.valueOf(JWTUtil.parseToken(token).setSigner(SIGNER).getPayload("payload"));
    }


    /**
     * 校验并获取载荷
     *
     * @param token JWT 字符串
     * @return payload 对象
     */
    public static <T> T getPayload(String token) {
        JWT jwt = parse(token);
        if (!jwt.validate(0)) {            // 0 表示不校验时间，只做签名
            throw new RuntimeException("Token 验证失败");
        }
        return (T) jwt.getPayload("payload");  // 对应 createToken 时的 key
    }

    /* 快速测试 */
//    public static void main(String[] args) {
//        String token = createToken("123456");
//        System.out.println(token);
//
//        JWT jwt = parse(token);
//        System.out.println(parseString(token)); // 123456
//    }
}